#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<list>
using namespace std;



//
//class A
//{
//public:
//	A() { ++count; }
//	A(const A& t) { ++count; }
//	~A() {}
//
//public:
//	static int count;
//};
//int A::count = 0;
//A func()
//{
//	A aa;
//	return aa;
//}
//
//int main()
//{
//
//
//
//	func();
//
//	A().count;
//
//
//
//
//	return 0;
//}


//class Date
//{
//public:
//	Date(int year , int month , int day )
//		: _year(year)
//		, _month(month)
//		, _day(day)
//	{}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	//Date d1 = 2014;
//	////Date d1 = 2014,10,22;
//	//Date d2 = { 2014, 10 };
//	//Date d3 = { 2014, 10,22 };
//
//	Date d1 = { 2014,22,3 };
//
//
//
//	return 0;
//}


// 扩展：一些构造时的优化，不同的编译器可能会不同（了解一下）
class A
{
public:
	//构造函数
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a)调用一次构造" << endl;
	}

	//拷贝函数
	A(const A& aa)
		:_a(aa._a)
	{
		cout << "A(const A& aa)调用一次拷贝" << endl;
	}

	//赋值重载函数
	A& operator=(const A& aa)
	{
		cout << "A& operator=(const A& aa)调用一次赋值" << endl;

		if (this != &aa)
		{
			_a = aa._a;
		}

		return *this;
	}

	//构析函数
	~A()
	{
		cout << "~A()调用一次构析" << endl;
	}
private:
	int _a;
};
//------------------------------
//构造+拷贝 = 构造
//int main()
//{
//	const A& aa1 = 1;
//
//	return 0;
//}

//------------------------------
//构造 + 拷贝 (不在同一行)
//void func(A aa)
//{
//
//}
//
//int main()
//{
//	A aa1(1);
//
//	func(aa1);
//
//	return 0;
//}
////------------------------------
//构造+拷贝构造->构造 
//void func(A aa1)
//{
//
//}
//
//int main()
//{
//	//匿名构造仅是构造（不是类型转换，谈何构造加拷贝）,然后再拷贝传参
//	func(A(2));
//
//	return 0;
//}
//------------------------------
//void func(A aa1)
//{
//
//}
////构造+拷贝构造->构造 
//int main()
//{
//	//3 到 aa1 是隐示类型转换 先构造 在拷贝
//	func(3);
//
//	return 0;
//}
//------------------------------
////------------------------------
// aa构造 函数返回拷贝 给aa2拷贝  后两次拷贝再同一行代码 所以是优化成一次拷贝
//A func()
//{
//	A aa;
//	return aa;
//}
//
//int main()
//{
//
//	A aa2 = func();
//
//	return 0;
//}
//------------------------------
 //aa2构造  aa构造 函数返回拷贝 给aa2赋值 
A func()
{
	A aa;
	return aa;
}

int main()
{

	A aa2;
	aa2 = func();

	return 0;
}



// 1、先用1构造一个临时对象 2、再用临时对象拷贝构造aa1
// 3、同一个表达式中，连续构造+构造/构造+拷贝构造/拷贝构造+拷贝构造会合二为一
// a、构造+构造->构造
// b、构造+拷贝构造->构造
// c、拷贝构造+拷贝构造->拷贝构造